src/lcm.js
zzmq.dev@gmail.com[dev3]/mathkit[add-lcm-b-function-returns-least-common] / src / lcm.js
@ e5bd6781
Download
Ladder Summary
- file Export gcd function alongside lcm and update index.js to re-export gcd
/**
* Computes the greatest common divisor (GCD) of two integers using the Euclidean algorithm.
*
* @param {number} a
* @param {number} b
* @returns {number} Non‑negative GCD of a and b.
*/
export function gcd(a, b) {
a = Math.abs(a);
b = Math.abs(b);
while (b !== 0) {
const temp = b;
b = a % b;
a = temp;
}
return a;
}
/**
* Returns the least common multiple (LCM) of two integers.
*
* @param {number} a
* @param {number} b
* @returns {number} The LCM, or NaN if either argument is not an integer.
*/
export function lcm(a, b) {
if (typeof a !== "number" || typeof b !== "number") return NaN;
if (!Number.isInteger(a) || !Number.isInteger(b)) return NaN;
if (a === 0 || b === 0) return 0;
const divisor = gcd(a, b);
return Math.abs((a / divisor) * b);
}
import { test } from "node:test";
import assert from "node:assert/strict";
test("lcm basic cases", () => {
assert.strictEqual(lcm(4, 6), 12);
assert.strictEqual(lcm(21, 6), 42);
assert.strictEqual(lcm(0, 5), 0);
assert.strictEqual(lcm(5, 0), 0);
assert.strictEqual(lcm(5, 5), 5);
assert.strictEqual(lcm(-3, 5), 15);
assert.strictEqual(lcm(-4, -6), 12);
});
test("lcm with non‑integer inputs returns NaN", () => {
assert.ok(Number.isNaN(lcm(2.5, 4)));
assert.ok(Number.isNaN(lcm(3, 4.1)));
});